先款后货技术方案
订单
新增配置
pay_order_valid_seconds # 订单支付的有效时间,单位:秒
DB改动
订单表
# order_new
pay_status # [新增] 支付状态 1:未支付 5:部分支付 10:已支付 15:超时关闭
settle_way # [新增] 结款方式 1:先货后款 2:先款后货
paid_amont # [新增] 已支付金额
refund_amount # [新增] 已退款金额
real_pay # 实际支付金额 = 已支付金额 - 已退款金额
freeze # 订单锁定
create_time
datetime
modify_time
订单状态机
待支付 --> 部分支付
待支付 --> 已支付
待支付 <--> 已关闭
部分支付 <--> 已支付
接口改动
BSHOP
订单列表
接口名:order/list(前端接口,见同目录订单.md)
拉取历史未支付订单 ***
order/unpaid_list(前端接口,见同目录订单.md)
订单详情
order/detail(前端接口,见同目录订单.md)
提交订单 ***
order/submit (待确定,是否需要在下单的时候去判断还有差额)
改动点
加入账期未支付
STATION
修改订单
接口名:order/edit, order/set_status,order/update/details,order/remove/details,order/delete
改动点:增加订单锁的校验逻辑
微服接口
创建订单 【修改】***
接口名:order/create
参数改动:无
接口改动:
1,订单初始化新增字段:
settle_way:结款方式,根据下单商户设置
pay_status:支付状态,默认为1(未支付)
real_pay:实际支付,默认0
refund:退款金额,默认0
freeze:冻结,默认0
paid_amount: 已付金额,默认0
refund_amount: 已退款金额,默认0
create_time:创建时间,默认当前时间
modify_time:修改时间,默认当前时间
返回改动:无
合单 **
order/split
改动点
增加合单判定条件:统一周期内,状态为待分拣并且订单和商户为同一种结款方式(先货后款)允许合单
增加锁单的判定
更新订单商品 ***
order/detail/update
改动点
已支付先款后货不能改
更新商品后,根据订单价格变化更改订单支付状态(部分支付/已支付)
删除订单商品
order/detail/delete
改动点
已支付先款后货不能改
删除商品后,根据订单价格变化更改订单支付状态(部分支付/已支付)
set_weight
改状态,部分支付已支付
更新订单
order/update
参数:
参数名 | 必传M/可选O | 类型 | 说明 |
---|---|---|---|
order_id | M | str | 订单号id,json格式的数组 |
freeze | O | bool | 是否锁单 |
先做一个锁单的功能,后续可以往这个接口增加业务
周边系统
定时解锁库存脚本 ***
脚本:release_order_stock
1,读取所有超过有效期(根据配置pay_order_valid_seconds)的未支付订单
2,恢复库存
3,将订单支付状态修改为已关闭
支付
DB改动
交易流水【新增】
# tbl_trade_flow
id
trade_no
uid
trade_type # 交易类型,订单支付、充值等 考虑下合二为一
pay_method # 支付方式,微信、余额
status # 交易状态 1:未支付 2:已支付
amount # 支付金额
balance_receipt # 余额支付凭证
wx_transaction_id # 微信单号
wx_bank_type # 微信到账银行
wx_fee_type # 微信到账货币类型
支付单【新增】
# tbl_order_pay
id # 支付单ID,ZFD*****
trade_no # 交易流水号
order_no # 订单号
uid # 用户id
amount # 支付金额
status # 状态 1:未支付 2:已支付
create_time
modify_time
退款单【新增】
# tbl_order_refund
id # 退款单ID,TK****
order_no # 订单号
uid # 用户id
amount # 退款金额
status # 状态 1:未退款 2:已退款
remark # 备注
deal_code # 退款凭证
create_time
modify_time
冲账单 【新增】
# tbl_order_strike
id # 订单冲账ID
strike_id # 冲账id
deal_code # 冲账凭证
order_no # 订单号
amount # 冲账金额
status # 状态 1:未冲账 2:已冲账
create_time
modify_time
微服接口
支付 ***
pay/order
参数:
参数名 | 必传M/可选O | 类型 | 说明 |
---|---|---|---|
order_ids | M | str | 订单号id,json格式的数组 |
接口逻辑:
1,订单可支付的校验
2,计算应付金额:未支付订单一并计算所有部分支付订单的差额,部分支付订单仅支付本次差额
3,生成支付单,生成交易流水
返回数据:
{
"code": 0,
"msg": "ok"
"data":{
"trade_no": TRADE_NO
"balance"
"money"
}
}
充值 ***
pay/charge
参数:
参数名 | 必传M/可选O | 类型 | 说明 |
---|---|---|---|
amount | M | int | 充值金额,单位:分 |
group_id | O | str | group id |
返回数据:
{
"code": 0,
"msg": "ok"
"data":{
"trade_no": TRADE_NO
}
}
发起支付***
pay
参数:
参数名 | 必传M/可选O | 类型 | 说明 |
---|---|---|---|
trade_no | M | str | 流水号 |
pay_method | M | str | wx:微信,balance:余额 |
openid | O | str | 下单客户的openid,微信支付时必传 |
nofity_openid | O | str | 微信通知的openid,默认为openid |
client | M | str | 支付终端 wx:公众号支付;app:app支付;driver:司机终端支付 |
接口逻辑
1,可支付状态校验:订单状态,金额
2,微信支付:
1)根据订单站点,客户端类型获取支付配置
2)根据配置请求微信支付的参数
余额支付:
1)发起余额支付,更新交易流水和支付单
2)执行统一的支付处理流程,修改订单状态
返回数据:
# 微信支付返回
{
"code": 0,
"msg": "ok"
"data": {
'appId': APPID,
'timeStamp': TIMESTAMP,
'nonceStr': NONCE_STR,
'package': 'prepay_id=PREPAY_ID'
'signType': 'MD5',
'paySign': PAY_SIGN
}
}
# 余额支付返回
{
"code": 0,
"msg": "ok"
}
支付结果通知***
pay/notify
参数:
参数名 | 必传M/可选O | 类型 | 说明 |
---|---|---|---|
raw_data | M | str | 微信通知的原始字符串 |
接口逻辑:
1,解析微信通知数据
2,事务内更新交易流水,支付单
3,执行统一的支付处理流程
1)订单支付:更新订单支付状态
2)充值:新增余额流水
签名校验放外面
订单退款 ***
order/refund
参数:
参数名 | 必传M/可选O | 类型 | 说明 |
---|---|---|---|
order_id | M | str | 退款订单号 |
remark | O | str | 备注 |
amount | O | bigint | 退款金额 |
接口逻辑:
1,退款条件校验
2,计算退款额
3,生成退款单
更新订单
4,调用支付模块退款
5,更新退款单
订单冲账***
order/strike
参数:
参数名 | 必传M/可选O | 类型 | 说明 |
---|---|---|---|
order_ids | M | list | 冲账订单号 |
strike_id | M | str | 冲账id |
接口逻辑
1,查询冲账信息,合法性校验
2,依次执行冲账:
1)新建订单冲账单
2)计算可冲账额度
3)事务内更新订单,冲账单,冲账条目
周边系统
定时退款 (去掉)
脚本:auto_order_refund
1,读取已到退款时间时间配置
2,读取时间配置内real_pay大于total_price的订单
3,调用支付模块退款
接口改动
BSHOP
以下接口改为调用微服
1, pay 发起支付
2, pay/charge 充值
3, pay/wechat 微信支付
4, pay/wechat/notify 微信支付通知
5, pay/balance 余额支付
6, pay/driver 司机支付
7, pay/app app支付
8, pay/app/charge app充值
冲账
接口改动
MA
拉取冲账订单列表
finance/order/can_strike_balance
改动点
筛选支付状态为未支付或者部分支付的订单
提交冲账
strike/balance/submit
改动点
调用订单微服发起冲账
~~时间配置(去掉)~~
~~DB改动~~
~~时间配置~~
# service_time
refund_time_span # 【新增】自动退款日
refund_time # 【新增】自动退款时间
~~接口改动~~
~~获取/修改时间配置~~
~~station/service_time~~
~~改动点~~
POST
参数新增:
refund_time_span
refund_time
GET
返回新增
refund_time_span
refund_time
商户配置
DB
用户表
# tbl_user
settle_way # [新增] 结款方式 1:先货后款 2:先款后货
站点
# station
default_settle_way # [新增] 结款方式 1:先货后款 2:先款后货
接口改动
编辑商户
接口名:custommanage/edit/****(前端接口)
改动点:增加结款方式字段
站点默认结算配置
商户结算
接口改动
商户结算搜索
接口:finance/order/search(前端接口)
改动点:增加已支付金额,退款金额,支付状态字段
订单交易流水 【新增】
finance/order/trade/flow(前端接口)
返回指定订单按时间排序的支付流水,退款流水,冲账流水
返回数据
{
"code": 0,
"msg": "ok"
"data": [{
"type": "pay", # 交易类型:支付,退款,冲账
"amount": 111,
"id": "", # 支付单,退款单,冲账单号
"operator": OPERATOR # 操作人
"create_time": CREATE_TIME
}]
}
MA*
退款 【新增】
finance/order/refund
调用微服接口退款
自动锁单脚本 ***
开发计划
支付 ----------
订单 ---- ---- 部分依赖于支付,部分依赖于商户配置
冲账 -- 依赖于支付(冲账)
时间配置 ------ 部分依赖于支付(退款)
商户配置 ---
商户结算 -- -- 部分依赖于支付(退款)
测试环境
bshop:7411
station:7412
ma:7413
order微服:7414
商品库微服:7415
db: 1204